vtd: interrupt remapping fix
authorKeir Fraser <keir.fraser@citrix.com>
Fri, 23 Oct 2009 09:13:22 +0000 (10:13 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Fri, 23 Oct 2009 09:13:22 +0000 (10:13 +0100)
Fix the error of translation from int remapping table entry(IRTE) to
MSI msg. This error may write wrong IRTE back to the VTd hardware, and
block physical interrupts.

Signed-Off-By: Zhai Edwin <edwin.zhai@intel.com>
xen/drivers/passthrough/vtd/intremap.c

index 595afbaa1e50689661f49bafb8108d993ba6c603..f68145df57fa5a199b1d4c3f51d52fb4f9a85260 100644 (file)
@@ -468,8 +468,12 @@ static int remap_entry_to_msi_msg(
             MSI_ADDR_DESTMODE_LOGIC) |
         ((iremap_entry->lo.dlm != dest_LowestPrio) ?
             MSI_ADDR_REDIRECTION_CPU:
-            MSI_ADDR_REDIRECTION_LOWPRI) |
-        iremap_entry->lo.dst >> 8;
+            MSI_ADDR_REDIRECTION_LOWPRI);
+    if ( x2apic_enabled )
+        msg->dest32 = iremap_entry->lo.dst;
+    else
+        msg->address_lo |=
+            ((iremap_entry->lo.dst >> 8) & 0xff ) << MSI_ADDR_DEST_ID_SHIFT;
 
     msg->data =
         MSI_DATA_TRIGGER_EDGE |